﻿-------------------------------------------------------------------------------
-- Создание резервной копии отредактированного файла. © SimSU
-------------------------------------------------------------------------------

---- Настройки
local function Settings()
-- Начало файла Profile\SimSU\Editor_DoBak.cfg
return{
  Enable=true; -- Делать резервные копии?
  Format="%s.bak%d"; -- Настройка правила формирования имени файла, для format(FileName,i,FileName). Например: "%s.bak%d" для "Editor_DoBak.lua" приведёт к "Editor_DoBak.lua.bak1", "%s;%d.bak" для "Editor_DoBak.lua" приведёт к "Editor_DoBak.lua;1.bak"
  ShowErr=true; -- Выводить сообщение об ошибке при невозможности создания копии.
  Folder="Backup"; -- Копии делать в указанной подпапке если она есть...
  ForceFolder=false; -- Если подпапки нет то создать папку?
  --Prior=50;
}
-- Конец файла Profile\SimSU\Editor_DoBak.cfg
end

---- Локализация
_G.far.lang=far.lang or win.GetEnv("farlang")
-- Встроенные языки / Buildin laguages
local function Messages()
if far.lang=="Russian" then
-- Начало файла Profile\SimSU\SimSU\Editor_DoBakRussian.lng
return{
  Descr="Создание резервной копии отредактированного файла. © SimSU";
}
-- Конец файла Profile\SimSU\Editor_DoBakRussian.lng
else--if far.lang=="English" then
-- Begin of file Profile\SimSU\Editor_DoBakEnglish.lng
return{
  Descr="Creation of a backup copy of the edited file. © SimSU";
}
-- End of file Profile\SimSU\Editor_DoBakEnglish.lng
end end

-------------------------------------------------------------------------------
local M=(loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_DoBak"..far.lang..".lng") or Messages)()
local S=(loadfile(win.GetEnv("FARLOCALPROFILE").."\\SimSU\\Editor_DoBak.cfg") or loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_DoBak.cfg") or Settings)()

local SimSU=SimSU or {}
-------------------------------------------------------------------------------
function SimSU.Editor_DoBak(Id,Event,Param)
  local FullName=Editor.FileName
  if win.GetFileAttr(FullName) then
    local Format=S.Format or "%s.bak%d"
    local _,_,Path,Name=FullName:find("(.+\\)([^\\]+)")
    local Folder= S.Folder or ""
    Path= Folder~="" and S.ForceFolder and win.CreateDir(Path..Folder,"t") and Path..Folder.."\\" or
      Folder~="" and (win.GetFileAttr(Path..Folder) or ""):find("d") and Path..Folder.."\\" or Path
    local i,NewName = 1,""
    repeat
      NewName=Path..Format:format(Name,i,Name)
      i=i+1
    until not win.GetFileAttr(NewName)
    local Ok,Err = win.CopyFile(FullName,NewName) -- Копируем файл.
    if S.ShowErr and Ok==nil then msgbox("",Err) end -- Если были ошибки выводим сообщение.
  end
end
-------------------------------------------------------------------------------
if not Macro then return {Editor_DoBak=SimSU.Editor_DoBak} end

local ok, mod = pcall(require,"SimSU.Editor_DoBak"); if ok then SimSU=mod else _G.SimSU=SimSU end
-------------------------------------------------------------------------------

Event {group="EditorEvent"; priority=S.Prior; description=M.Descr;
  condition=function(Id,Event,Param) return S.Enable and Event==far.Flags.EE_SAVE and (editor.GetInfo(Id).CurState==far.Flags.ECSTATE_MODIFIED or Param.CodePage~=editor.GetInfo(nil).CodePage) and Editor.FileName:upper()==Param.FileName:upper() end;
  action=SimSU.Editor_DoBak;
}
